package model.prestamos.estado;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import model.cliente.Cliente;
import model.prestamos.Prestamo;

import org.junit.Before;
import org.junit.Test;

import excepciones.prestamos.NoSePuedeCobrarCuotaException;
import excepciones.prestamos.NoSePuedePasarPrestamoADeudorIncobrableException;
import excepciones.prestamos.NoSePuedePasarPrestamoAEnDeudaException;

/**
 * @author Lucas
 */
public class PrestamoSolicitadoTest {

        private Solicitado prestamoSolicitado = new Solicitado();
        private Prestamo prestamoMock = mock(Prestamo.class);

        @Before
        public void setUp(){
                when(prestamoMock.getCliente()).thenReturn(mock(Cliente.class));
        }
        
        /** Verifica que un prestamo aprobado cambia su estado a EnCurso */
        @Test
        public void testAprobacionDePrestamo() {
                prestamoSolicitado.aprobar(prestamoMock);
                verify(prestamoMock).aEnCurso();
        }

        /**
         * Verifica que un prestamo al ser rechazado cambie su estado a Rechazado y
         * que no falle al no darle motivo
         */
        @Test
        public void testRechazoDePrestamoMotivoNull() {
                prestamoSolicitado.rechazar(prestamoMock, null);
                verify(prestamoMock).aRechazado(null);
        }

        /**
         * Verifica que un prestamo al ser rechazado cambie su estado a Rechazado y
         * que no falle al recibir un motivo con caracteres raros
         */
        @Test
        public void testRechazoDePrestamoMotivoSinSentido() {
                String motivo="asdasdasdasd";
                prestamoSolicitado.rechazar(prestamoMock, motivo);
                verify(prestamoMock).aRechazado(motivo);
        }

        /**
         * Verifica que el metodo cobrarCuota arroja una excepcion para un prestamo
         * solicitado
         * 
         * @throws NoSePuedeCobrarCuotaException
         */
        @Test(expected = NoSePuedeCobrarCuotaException.class)
        public void testCobrarCuotaNoHaceNada()
                        throws NoSePuedeCobrarCuotaException {
                prestamoSolicitado.cobrarCuota(prestamoMock);
        }

        /**
         * Verifica que el metodo pasarPrestamoAEnDeuda no tiene sentido para un
         * prestamo solicitado
         * 
         * @throws NoSePuedePasarPrestamoAEnDeudaException
         */
        @Test(expected = NoSePuedePasarPrestamoAEnDeudaException.class)
        public void testPasarPrestamoAEnDeudaNoHaceNada()
                        throws NoSePuedePasarPrestamoAEnDeudaException {
                prestamoSolicitado.pasarPrestamoAEnDeuda(prestamoMock);
        }

        /**
         * Verifica que el metodo pasarPrestamoADeudorIncobrable no tiene sentido
         * para un prestamo solicitado
         * 
         * @throws NoSePuedePasarPrestamoADeudorIncobrableException
         */
        @Test(expected = NoSePuedePasarPrestamoADeudorIncobrableException.class)
        public void testPasarPrestamoADeudorIncobrableNoHaceNada()
                        throws NoSePuedePasarPrestamoADeudorIncobrableException {
                prestamoSolicitado.pasarPrestamoADeudorIncobrable(prestamoMock);
        }

        /** Verifica que un prestamo solicitado responde true al metodo estaSolicitado() */
        @Test
        public void testPrestamoEsSolicitado() {
                assertTrue(prestamoSolicitado.estaSolicitado());
        }

        /** Verifica que el prestamo solicitado no esta en curso */
        @Test
        public void testPrestamoNoEstaEnCurso() {
                assertFalse(prestamoSolicitado.estaEnCurso());
        }

        /** Verifica que el prestamo solicitado no esta en deuda */
        @Test
        public void testPrestamoNoEstaEnDeuda() {
                assertFalse(prestamoSolicitado.estaEnDeuda());
        }

        /** Verifica que el prestamo solicitado no esta en deuda incobrable */
        @Test
        public void testPrestamoNoEstaEnDeudaIncobrable() {
                assertFalse(prestamoSolicitado.estaEnDeudaIncobrable());
        }

        /** Verifica que el prestamo solicitado no esta finalizado */
        @Test
        public void testPrestamoNoEstaFinalizado() {
                assertFalse(prestamoSolicitado.estaFinalizado());
        }

        /** Verifica que el prestamo solicitado no esta rechazado */
        @Test
        public void testPrestamoNoEstaRechazado() {
                assertFalse(prestamoSolicitado.estaRechazado());
        }

        /** Verifica que un prestamo solicitado no adeuda cuotas */
        @Test
        public void testPrestamoSolicitadoNoAdeudaCuotas(){
                assertFalse(prestamoSolicitado.adeudaCuotas(prestamoMock));
        }
        
}